Створення портлетів користувальницького меню
============================================

Грунтуючись на аналізі вимог, нам необхідні три портлети:
«користувальницьке меню», «хмара тегів» та «останні коментарі».
Ми реалізуємо їх, розширивши віджет [CPortlet](http://www.yiiframework.com/doc/api/CPortlet),
що входить до складу Yii.

У цьому розділі ми розробимо свій перший портлет — портлет
користувальницького меню, який відображає список пунктів меню,
доступних тільки аутентифікованим користувачам.
Меню містить чотири елементи:

 * Ухвалити коментар: гіперпосилання, що веде до списку коментарів, які очікують схвалення;
 * Створити новий запис: гіперпосилання, що веде до сторінки створення запису;
 * Управління записами: гіперпосилання, що веде до сторінки управління записами;
 * Вихід із системи: кнопка, при натисканні на яку поточний користувач виходить із системи.

Створення класа `UserMenu`
-------------------------

Ми створюємо клас `UserMenu` для представлення логічної частини портлетів користувальницького меню. Клас зберігається у файлі
`/wwwroot/blog/protected/components/UserMenu.php`:

~~~
[php]
Yii::import('zii.widgets.CPortlet');

class UserMenu extends CPortlet
{
	public function init()
	{
		$this->title=CHtml::encode(Yii::app()->user->name);
		parent::init();
	}

	protected function renderContent()
	{
		$this->render('userMenu');
	}
}
~~~

Клас `UserMenu` успадковується від класу `CPortlet` із бібліотеки `zii`. 
Він перевизначає методи `init()` та `renderContent()` класу `CPortlet`. 
Перший встановлює імʼя поточного користувача у якості заголовку портлета, 
а другий генерує зміст портлета, рендерингом представлення `userMenu`.

> Tip|Підказка: Зауважимо, що ми явним чином підключаємо клас `CPortlet`, 
викликаючи `Yii::import()` до першого звернення до нього. 
`CPortlet` є частиною офіційної бібліотеки розширень `zii`, 
класи якої не підключаються автоматично з міркувань продуктивності.

Створення представлення `userMenu`
----------------------------------

Потім ми створюємо представлення `userMenu`, збережене у файлі
`/wwwroot/blog/protected/components/views/userMenu.php`:

~~~
[php]
<ul>
	<li><?php echo CHtml::link('Створити новий запис',array('post/create')); ?></li>
	<li><?php echo CHtml::link('Управління записами',array('post/admin')); ?></li>
	<li><?php echo CHtml::link('Ухвалення коментарів',array('comment/index'))
		. ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
	<li><?php echo CHtml::link('Вихід',array('site/logout')); ?></li>
</ul>
~~~

> Info|Інформація: За замовчуванням файли представлення віджета повинні поміщатися
у піддиректорію `views` директорії, що містить файл класу віджета. 
Імʼя файлу має бути таким же, як назва представлення.

Використання портлета `UserMenu`
--------------------------------

Прийшов час використовувати наш новий портлет `UserMenu`. Ми змінюємо файл макету
`/wwwroot/blog/protected/views/layouts/column2.php` наступним чином:

~~~
[php]
…
<div id="sidebar">
	<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?>
</div>
…
~~~

У коді вище ми викликаємо метод `widget()` для генерації 
і виконання екземпляра класу `UserMenu`. 
Оскільки портлет повинен відображатися тільки аутентифікованим користувачам, 
ми викликаємо `widget()` у разі, якщо властивість `isGuest` поточного користувача 
є `false` (тобто користувач аутентифікований).

Тестування портлета `UserMenu`
------------------------------

Давайте протестуємо те, що у нас вийшло.

 1. Відкриємо вікно браузера і введемо URL `http://www.example.com/blog/index.php`.
    Перевіримо, що нічого не відображається у сайдбарі сторінки.
 2. Натиснемо гіперпосилання `Увійти` і заповнимо реєстраційну форму для входу.
    У разі успіху, перевіримо, що портлет `UserMenu` зʼявився у сайдбарі 
    і у нього у заголовку виведено імʼя користувача.
 3. Натиснемо гіперпосилання `Вийти` у портлеті `UserMenu`. Перевіримо, що дія
    виходу із системи успішно виконана, і портлет `UserMenu` зник.


Підсумок
--------

Ми створили портлет, який легко повторно використовувати. 
Ми можемо легко знову використовувати його у іншому проекті, 
незначно змінивши або навіть без модифікацій. 
Крім того, дизайн портлетів слідує філософії про розділення представлення і логіки. 
Хоча ми і не вказували на це у попередніх розділах, 
така практика використовується майже всюди у типовому додатку Yii.
